package sicnu.cs.ich.ich.service;




import com.github.pagehelper.PageInfo;
import org.apache.rocketmq.client.exception.MQBrokerException;
import org.apache.rocketmq.client.exception.MQClientException;
import org.apache.rocketmq.remoting.exception.RemotingException;
import org.springframework.web.multipart.MultipartFile;
import sicnu.cs.ich.api.domain.dto.*;
import sicnu.cs.ich.api.domain.entity.Ich;
import sicnu.cs.ich.api.domain.entity.IchProvince;
import sicnu.cs.ich.api.domain.form.IchForm;
import sicnu.cs.ich.api.domain.form.IchQueryParam;
import sicnu.cs.ich.api.domain.form.PageParam;
import sicnu.cs.ich.api.domain.vo.AdminIchVo;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutionException;

/**
 * @author CaiKe
 */
public interface IIchService {
    /**
     * 获取各省的非遗数据（结果按照非遗数量降序排列）
     *
     * @return 省id、省名字、省非遗数量的列表
     */
    List<IchProvinceDTO> getProvinceIch();

    /**
     * 获取各省的非遗数据（结果按照非遗数量降序排列）
     *
     * @return 市id、市名字、市非遗数量的列表
     */
    List<IchCityDTO> getCityIch(Integer province);

    /**
     * 获取单个非遗信息
     *
     * @param id 非遗id
     * @return 非遗
     */
    Ich getIchById(Integer id) throws InterruptedException;

    /**
     * 获取非遗
     *
     * @param typeId 类型id
     * @return list
     */
    PageInfo<IchDTO> getIchsByTypeId(Integer typeId, PageParam param, Integer province);

    /**
     * 获取非遗单品集合
     *
     * @param ids id集合
     * @return 非遗列表
     */
    List<IchDTO> getIchByList(List<Integer> ids);


    /**
     * 清楚缓存
     */
    void clearCache();

    /**
     * 获取省信息
     *
     * @param province 省id
     * @return 省信息
     */
    IchProvince ichProvince(Integer province);

    /**
     * 获取地区下的各类型非遗总数
     *
     * @param regionId 地区id
     */
    List<IchTypeDTO> getTypeCountOfRegion(Integer regionId);

    /**
     * 获取指定非遗的点赞主力量
     */
    Integer getIchLikeNumById(Integer ichId);

    /**
     * 删除Redis中所有非遗点赞助力数量信息
     */
    void clearLikeNum();

    IchProvinceDTO getProvinceTypeHotIchs(Integer province) throws ExecutionException;

    /**
     * 收场非遗
     */
    boolean collectIch(Integer ichId);

    /**
     * 获取收藏的非遗目录
     *
     * @param param 分页参数
     */
    PageInfo<IchDTO> getFavoriteIchs(PageParam param);

    /**
     * 查询是否收藏
     *
     * @param ichId 非遗id
     */
    boolean isCollected(Integer ichId);

    /**
     * 删除收藏非遗
     *
     * @param ichId 非遗Id
     */
    boolean deleteFavoriteIch(Integer ichId);

    /**
     * 获取相似非遗
     * @param ichId 非遗id
     * @return 相似非遗列表
     */
    List<IchDTO> getSimilarIchsByType(Integer ichId, Integer typeId,Integer province);

    /**
     * 获取类型名
     * @param typeId 类型id
     */
    String getType(Integer typeId);

    /**
     * 获取所有非遗数据id
     */
    List<Integer> getAllIchId();

    List<IchHotDTO> getProvinceIchHotDTO(String province, Integer preNum);

    void deleteIchById(Integer id) throws MQClientException, RemotingException, InterruptedException, MQBrokerException;

    void cacheIchs(List<Integer> ids, Long seconds);

    AdminIchVo getAdminIchVo(Integer ichId);

    /**
     * 分页获取非遗列表
     */
    PageInfo<IchDTO> getIchDTOS(IchQueryParam param);

    /**
     * 判断非遗是否存在
     */
    boolean isIchExisted(Integer ichId);

    /**
     * 更新非遗照片
     */
    boolean updateIchCoverImage(MultipartFile file, Integer ichId) throws IOException;

    /**
     * 新增非遗
     */
    boolean addIch(IchForm ichForm);

    /**
     * 非遗图片入库
     */
    boolean addIchImages(Integer ichId, List<String> keys);
}
